package com.ruibo.modules.quartz.task;


import com.ruibo.modules.utils.SendDataUtil;
import com.ruibo.tax.constants.TaxConstants;
import com.ruibo.tax.model.HBJHHBCF;
import com.ruibo.tax.model.HBJHJCZDJC;
import com.ruibo.tax.model.HBJHXKZJBXX;
import com.ruibo.tax.repository.HBJHHBCFRepository;
import com.ruibo.tax.repository.HBJHJCZDJCRepository;
import com.ruibo.tax.repository.HBJHXKZJBXXRepository;
import com.ruibo.tax.service.HBJHHBCFService;
import com.ruibo.tax.service.HBJHJCZDJCService;
import com.ruibo.tax.service.HBJHXKZJBXXService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;

import java.util.List;


/**
 * @description: 环保发送业务数据到税务   后续可对操作步骤优化
 * @author: 孙 峰
 * @time: 2020/10/15 17:26
 */
@Slf4j
@Component
public class HB2SWTask {
    /**
     * 排污许可
     */
    @Autowired
    private HBJHXKZJBXXService hbjhxkzjbxxService;

    @Autowired
    private HBJHXKZJBXXRepository hbjhxkzjbxxRepository;
    /**
     * 自动监测
     */
    @Autowired
    private HBJHJCZDJCService hbjhjczdjcService;
    @Autowired
    private HBJHJCZDJCRepository hbjhjczdjcRepository;
    /**
     * 环保处罚
     */
    @Autowired
    private HBJHHBCFService hbjhhbcfService;
    @Autowired
    private HBJHHBCFRepository hbjhhbcfRepository;


    @Autowired
    private SendDataUtil sendDataUtil;

    /**
     * 排污许可证基本信息包发送
     * 这里不能使用异步执行任务 需要记录任务执行时间
     * 异步任务执行会导致 结果立即返回
     *
     * @throws IllegalAccessException
     */
    public void pwxkz() throws IllegalAccessException {
        log.info("执行排污许可证包数据推送开始");
        // 获取对方未接受的数据量
        Integer unSendCount = hbjhxkzjbxxRepository.countAllByStatusAndSendStatus(TaxConstants.ACTIVE, null);
        // 发送数据
        int pages = (int) Math.ceil(unSendCount / 50.0);

        for (int i = 0; i < pages; i++) {
            Sort sort = Sort.by(Sort.Direction.ASC, "id");
            PageRequest request = PageRequest.of(0, 50, sort);
            List<HBJHXKZJBXX> list = hbjhxkzjbxxService.getList(TaxConstants.ACTIVE, null, request);
            sendDataUtil.sendPWXKDataToMQ(list);
            // 执行完压缩之后
            list.forEach(hbjhxkzjbxx -> {
                //修改数据发送次数
                hbjhxkzjbxx.setTimes(hbjhxkzjbxx.getTimes() == null ? 1 : hbjhxkzjbxx.getTimes() + 1);
                hbjhxkzjbxx.setSendStatus(TaxConstants.SEND);
            });
            hbjhxkzjbxxRepository.saveAll(list);
            log.info("执本次行排污许可证包发送成功");
        }
        log.info("执行排污许可证包数据推送开始");
    }

    /**
     * 自动监测任务执行
     */
    public void zdjc() throws IllegalAccessException {
        log.info("执行自动监测数据推送开始");
        // 获取对方未接受的数据量
        Integer unSendCount = hbjhjczdjcRepository.countAllByStatusAndSendStatus(TaxConstants.ACTIVE, null);
        // 发送数据
        int pages = (int) Math.ceil(unSendCount / 100.0);

        for (int i = 0; i < pages; i++) {
            Sort sort = Sort.by(Sort.Direction.ASC, "id");
            PageRequest request = PageRequest.of(0, 100, sort);
            List<HBJHJCZDJC> list = hbjhjczdjcService.findByStatusAndSendStatus(TaxConstants.ACTIVE, null, request);

            sendDataUtil.sendZDJCDataToMQ(list);

            // 执行完压缩之后
            list.forEach(hbjhjczdjc -> {
                //修改数据发送次数
                hbjhjczdjc.setTimes(hbjhjczdjc.getTimes() == null ? 1 : hbjhjczdjc.getTimes() + 1);
                hbjhjczdjc.setSendStatus(TaxConstants.SEND);
            });
            hbjhjczdjcRepository.saveAll(list);
            log.info("执行本次数据包发送成功");
        }

        // 执行完压缩之后
        log.info("执行自动监测数据推送结束");
    }


    /**
     * 环保处罚
     */
    public void hbcf() {
        log.info("环保处罚数据包推送开始");
        // 获取对方未接受的数据量
        Integer unSendCount = hbjhhbcfRepository.countAllByStatusAndSendStatus(TaxConstants.ACTIVE, null);
        // 发送数据
        int pages = (int) Math.ceil(unSendCount / 100.0);

        for (int i = 0; i < pages; i++) {
            Sort sort = Sort.by(Sort.Direction.ASC, "id");
            PageRequest request = PageRequest.of(0, 100, sort);
            List<HBJHHBCF> list = hbjhhbcfService.findByStatusAndSendStatus(TaxConstants.ACTIVE, null, request);
            sendDataUtil.sendHBCFDataToMQ(list);
            // 执行完压缩之后
            list.forEach(hbjhhbcf -> {
                //修改数据发送次数
                hbjhhbcf.setTimes(hbjhhbcf.getTimes() == null ? 1 : hbjhhbcf.getTimes() + 1);
                hbjhhbcf.setSendStatus(TaxConstants.SEND);
            });
            hbjhhbcfRepository.saveAll(list);
            log.info("执行本次数据包发送成功");
        }
        // 执行完压缩之后
        log.info("环保处罚数据推送结束");
    }


}
